//////////////////////////////////////////////////////////////////////////

#ifndef _CONNECTION_H_
#include "connection.h"
#endif

//////////////////////////////////////////////////////////////////////////

#include <iostream>
#include <boost/bind.hpp>

//////////////////////////////////////////////////////////////////////////


Connection::Connection( const TCPSocketPtr& _TCPSocket )
: m_TCPSocket(_TCPSocket)
{
}


//////////////////////////////////////////////////////////////////////////


Connection::~Connection()
{
}


//////////////////////////////////////////////////////////////////////////


void Connection::SendTCP( const NetworkPacket& _data )
{
    // SendTCP data through TCP
    m_TCPSocket->async_send( boost::asio::buffer( _data.Data(), _data.Size() ),
        boost::bind( &Connection::HandleSendTCP, this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred ) );
}


////////////////////////////////////////////////////////////////////////////////


void Connection::StartReceiveTCP()
{
    // Recv data through TCP
    m_TCPSocket->async_receive( boost::asio::buffer(m_RecvBufferTCP, MAX_BUFFER_SIZE),
        boost::bind( &Connection::HandleRecvTCP, this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred ) );
}


////////////////////////////////////////////////////////////////////////////////


void Connection::HandleSendTCP( const boost::system::error_code& _error,
                                size_t _bytesTransferred )
{
    // Check for errors
    if (_error)
    {
        std::cout << "ERROR SEND TCP: " << _error.message() << std::endl;
        return;
    }

    NotifyObservers(Observer::NETWORK_SEND_COMPLETE_TCP);
}


////////////////////////////////////////////////////////////////////////////////


void Connection::HandleRecvTCP( const boost::system::error_code& _error,
                                size_t _bytesTransferred )
{
    // Check for errors
    if (_error)
    {
        std::cout << "ERROR RECV TCP: " << _error.message() << std::endl;
        HandleDisconnect();
        return;
    }

    m_TCPRecvPacket = NetworkPacket(m_RecvBufferTCP, _bytesTransferred);
    NotifyObservers(Observer::NETWORK_RECEIVE_COMPLETE_TCP);

    // Start receive TCP again
    StartReceiveTCP();
}


////////////////////////////////////////////////////////////////////////////////


void Connection::HandleDisconnect()
{
    NotifyObservers(Observer::NETWORK_DISCONNECT);
}


////////////////////////////////////////////////////////////////////////////////


const NetworkPacket& Connection::GetTCP() const
{
    return m_TCPRecvPacket;
}


////////////////////////////////////////////////////////////////////////////////


const NetworkPacket& Connection::GetUDP() const
{
    return m_UDPRecvPacket;
}


////////////////////////////////////////////////////////////////////////////////


bool Connection::IsConnected() const
{
    return m_TCPSocket->is_open();
}


////////////////////////////////////////////////////////////////////////////////
